package reportehorario.modelo.dao;

import java.sql.Time;
import java.util.ArrayList;
import java.util.Calendar;
import reportehorario.modelo.interfaces.HorarioDAO;
import reportehorario.recursos.beans.BeanEntradaXUsuarioXFecha;
import reportehorario.recursos.beans.BeanJustificaciones;
import reportehorario.recursos.beans.BeanRecord;
import reportehorario.recursos.beans.BeanUsuario;

public class MySQLHorarioDAO implements HorarioDAO {

    private int dias_tarde;
    private int min_tolerancia;
    private int dias_min_tolerancia;
    private int prom_min_toleracia;
    private int dias_justificados;
    private int dias_marcados;
    private BeanJustificaciones justificaciones = null;

    public BeanRecord obtenerRecordXUsuarioXRangoFecha(BeanUsuario beanUsuario, ArrayList<BeanEntradaXUsuarioXFecha> listaEntradasTodos) {
        BeanRecord beanRecord = new BeanRecord();
        dias_tarde = 0; // se modifica dentro de calcularMinutosTardanza
        prom_min_toleracia = 0;
        dias_justificados = 0;
        dias_marcados = 0;
        ArrayList<BeanEntradaXUsuarioXFecha> listaEntradasXUsuarioMarcadas = new ArrayList<BeanEntradaXUsuarioXFecha>();
        
        beanRecord.setId(beanUsuario.getIdUsuario());
        beanRecord.setUsuario(beanUsuario.getNombre_apellido());
        for (BeanEntradaXUsuarioXFecha bET : listaEntradasTodos) {
            if (bET.getIdUsuario() == beanUsuario.getIdUsuario()) {
                listaEntradasXUsuarioMarcadas.add(bET);
            }
            dias_marcados = listaEntradasXUsuarioMarcadas.size();
        }
        beanRecord.setDias_marcados(dias_marcados);
        beanRecord.setMin_tardanza(calcularMinutosTardanza(beanUsuario.getListaEntradas(), listaEntradasXUsuarioMarcadas, beanUsuario.getMinutos_tolerancia()));
        beanRecord.setDias_tardanza(dias_tarde);
        beanRecord.setProm_minutos_usados(prom_min_toleracia);
        beanRecord.setDias_justificados(dias_justificados);
        beanRecord.setJustificaciones(justificaciones);

        return beanRecord;
    }

    private int calcularMinutosTardanza(ArrayList<Time> listaEntradasEstablecidas, ArrayList<BeanEntradaXUsuarioXFecha> listaEntradasXUsuarioMarcadas, int tolerancia) {
        int res = 0;
        long diferencia = 0;
        min_tolerancia = 0;
        dias_min_tolerancia = 0;
        dias_justificados = 0;
        dias_tarde = 0;
        justificaciones = null;
        String cadena = "";

        for (BeanEntradaXUsuarioXFecha l : listaEntradasXUsuarioMarcadas) {

            Calendar cal = Calendar.getInstance();
            cal.setTime(l.getFecha());
            int diaSemana = cal.get(Calendar.DAY_OF_WEEK);


            diferencia = l.getHora_entrada().getTime() - listaEntradasEstablecidas.get(diaSemana - 2).getTime();
            

            //pasamos a minutos la diferencia
            diferencia /= 1000;
            diferencia /= 60;

            if (diferencia > tolerancia) {
                //obtenemos el tipo de justificacion para armar la cadena de justificaciones
                if (l.getTipo_justificacion() != 1) {

                    cadena += ("\n" + l.getFecha() + "  " + l.getOtro_justificacion());
                    dias_justificados++;
                } else {
                    res += (diferencia - tolerancia);
                    dias_tarde++;
                }

            } else {
                if (diferencia > 0) {
                    dias_min_tolerancia++;
                    min_tolerancia += diferencia;
                }
            }
        }
        if (justificaciones == null && cadena.compareTo("") != 0) {
            justificaciones = new BeanJustificaciones();
            justificaciones.setJustificacion(cadena);
        }

        if (dias_min_tolerancia != 0) {
            prom_min_toleracia = min_tolerancia / dias_min_tolerancia;
        }
        return res;
    }
}
